在我們了解了陣列後,接下來就可以來回顧一下**字串 (String) **資料型態了。在[DAY 3] 程式中不起眼卻很重要的角色 - 資料與資料型態 中曾提到:
字元資料型態是把每一個文字都當成一個獨立的資料來進行儲存
字串資料型態則是把一組文字當成一個獨立的資料來進行儲存
而在了解陣列的概念後再次回顧字元資料型態和字串資料型態的關係時,我們便可以知道字串資料型態其實是由字元資料型態組成的陣列。而這也是為什麼我們會發現早期的程式語言,如 C 語言,並沒有提供字串資料型態。後來,由於處理文字資料的需求偏多,字元資料型態的陣列才被整合為字串資料型態,不過,它的本質仍然是一個陣列。
C 語言中的字串:
char text[] = "hello"; // 實際上就是在宣告一個字元資料型態的陣列
不過,即便 C 語言沒有提供字串資料型態,它還是有針對文字資料的特點提供了一些供字串使用的專屬函式來讓我們處理它時可以更方式,而後來出現的大多數程式語言也有參考這一點提供這些函式。因此,就讓我們一起來看看有哪些功能吧:
1. 字串長度 (Length):
字串長度功能的目的是讓我們可以直接知道字串中的文字資料的實際長度,本來是為了針對我們難以預先知道文字資料實際的長度的特點而設計,不過現在很多程式語言也為陣列提供了類似的功能,讓我們可以隨時確認陣列的長度。
C 語言中的確認字串長度功能:
#include <stdio.h>
#include <string.h>
int main()
{
char str[100]; // 準備儲存字串的字元陣列
printf("請輸入文字:");
scanf("%s", str); // 讀取使用者輸入的文字並儲存在字元陣列 str 中
int length = strlen(str); // 獲取字元陣列 str 中的文字長度
printf("文字長度為:%d\n", length);
return 0;
}
C# 中的確認字串長度功能:
using System;
public class StringLength
{
public static void Main(string[] args)
{
string str; // 準備字串資料型態
Console.Write("請輸入文字:");
str = Console.ReadLine(); // 讀取使用者輸入的文字並儲存在字串資料型態 str 中
Console.WriteLine("文字長度為:" + str.Length); // 獲取字串資料型態 str 中的文字長度並顯示出來
}
}
2. 字串複製 (Copy)
字串複製功能的目的是讓我們可以把字串中的文字內容複製到其他的字串中,而這一功能的最大特點便是我們可以選擇只複製部分的文字內容。在一些程式語言中,這功能也會被改稱為子字串 (SubString)。
C 語言中的字串複製功能:
#include <stdio.h>
#include <string.h>
int main()
{
char str[100]; // 準備儲存字串的字元陣列 str
char cpyStr[100]; // 準備儲存字串的字元陣列 cpyStr
printf("請輸入文字:");
scanf("%s", str); // 讀取使用者輸入的文字並儲存在字元陣列 str 中
int length = strlen(str); // 獲取字元陣列 str 中的文字長度
strncpy(cpyStr, str, length / 2); // 把字元陣列 str 中的一半長度的文字複製到字元陣列 cpyStr 中
printf("你輸入的文字前半部為: %s\n", cpyStr);
return 0;
}
C# 中的子字串(字串複製)功能:
using System;
public class SubstringExample
{
public static void Main(string[] args)
{
string str, cpyStr; // 準備字串資料型態 str 及 cpyStr
Console.Write("請輸入文字:");
str = Console.ReadLine(); // 讀取使用者輸入的文字並儲存在字串資料型態 str 中
int length = str.Length; // 獲取字串資料型態 str 中的文字長度
cpyStr = str.Substring(0, length / 2); // 把字串 str 中的一半長度的文字複製到字串 cpyStr 中
Console.WriteLine("你輸入的文字前半部為:" + cpyStr);
}
}
3. 字串串接 (Concat)
字串串接功能的目的是讓我們可以把兩組不同的字串合在一起成為一組更長的字串,這很常在處理一些文字資料時使用。很多程式語言也在對字串使用加法運算子 (+) 時會預設進行字串串接功能,而這情況下通常會被稱為字串運算子 (String Operators)。
C 語言中的字串串接功能:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100]; // 準備儲存字串的字元陣列 str1
char str2[100]; // 準備儲存字串的字元陣列 str2
printf("請輸入文字1:");
scanf("%s", str1); // 讀取使用者輸入的文字並儲存在字元陣列 str1 中
printf("請輸入文字2:");
scanf("%s", str2); // 讀取使用者輸入的文字並儲存在字元陣列 str2 中
char concat[strlen(str1) + strlen(str2) + 1]; // 使用字元陣列 str1 跟 str2 的實際文字長度來準備儲存字串的字元陣列 concat
strcat(concat, str1); // 把字元陣列 str1 的文字串接到字元陣列 concat 中
strcat(concat, str2); // 把字元陣列 str2 的文字串接到字元陣列 concat 中
printf("合併的文字為: %s\n", concat);
return 0;
}
C# 中的字串串接功能:
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
string str1, str2; // 準備字串 str1 及 str2
Console.Write("請輸入文字1:");
str1 = Console.ReadLine(); // 讀取使用者輸入的文字並儲存在字串 str1 中
Console.Write("請輸入文字2:");
str2 = Console.ReadLine(); // 讀取使用者輸入的文字並儲存在字串 str2 中
string concat = str1 + str2; // 把字串 str1 及 str2 串接在一起並儲存在字串 concat 中
Console.WriteLine("合併的文字為: " + concat);
}
}
4. 字串比較 (Compare)
字串比較功能的目的是讓我們可以快速比較兩組字串,一般會由字串的第一個字元開始逐一進行比較大小 (通常比較項目是 ASCII 的編碼大小),如果第一個字元的比較結果為相同,便會繼續比較第二個字元,如何類推。有些程式語言會讓我們自訂比較字串的方法,讓我們可以更靈活地處理文字資料。一般來說,如果回傳的數字大於 0 便表示第一組的字串較大;回傳的數字等於 0 便表示兩組的字串為相同;回傳的數字小於 0 則表示第一組的字串較小。
C 語言中的字串比較功能:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100];
char str2[100];
printf("請輸入文字1:");
scanf("%s", str1);
printf("請輸入文字2:");
scanf("%s", str2);
int compare = strcmp(str1, str2); // 比較字元陣列 str1 與字元陣列 str2 的文字
if (compare == 0) { // 比較結果為 0 時代表兩組字元陣列的文字一模一樣
printf("兩組文字是相同的\n");
}
else {
printf("兩組文字是不相同的\n");
}
return 0;
}
C# 中的字串比較功能:
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
string str1, str2;
Console.Write("請輸入文字1:");
str1 = Console.ReadLine();
Console.Write("請輸入文字2:");
str2 = Console.ReadLine();
int compare = string.Compare(str1, str2); // 比較字串 str1 與字串 str2 的文字
if (compare == 0) { // 比較結果為 0 時代表兩組字串的文字一模一樣
Console.WriteLine("兩組文字是相同的");
}
else {
Console.WriteLine("兩組文字是不相同的");
}
}
}
5. 字串搜尋 (Index/Search)
字串搜尋功能的目的是讓我們可以知道某些特定的字元或子字串是否有出現在目標的字串中,並會回傳首次出現該字元的位置或該子字串的第一個字元位置。
C 語言中的字串搜尋功能:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100];
char str2[100];
printf("請輸入文字1:");
scanf("%s", str1);
printf("請輸入文字2:");
scanf("%s", str2);
int search = strcspn(str1, str2); // 從字元陣列 str1 中搜尋字元陣列 str2 的字元
if (search < strlen(str1)) { // 當回傳結果小於字元陣列 str1 的文字長度時代表字元陣列 str2 的字元有出現在字元陣列 str1 中
printf("文字2的字元出現在文字1中的%d位置\n", search);
}
else {
printf("文字2的字元沒有出現在文字1中\n");
}
return 0;
}
C# 中的字串搜尋功能:
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
string str1, str2;
Console.Write("請輸入文字1:");
str1 = Console.ReadLine();
Console.Write("請輸入文字2:");
str2 = Console.ReadLine();
int search = str1.IndexOf(str2); // 從字串 str1 中搜尋字串 str2 的字元
if (search >= 0) { // 當回傳結果小大於或等於 0 時代表字串 str2 的字元有出現在字串 str1 中
Console.WriteLine("文字2的字元出現在文字1中的" + search + "位置");
}
else {
Console.WriteLine("文字2的字元沒有出現在文字1中");
}
}
}
6. 字串轉換 (Parser)
可參考[DAY 7] 為不同的變數建立溝通橋樑的型態變換中的語法剖析器(Parser)部分。
7. 字串格式化 (Format)
可參考[DAY 7] 為不同的變數建立溝通橋樑的型態變換中ToString 函式的格式化字串部分。詳細的常見字串格式也可在微軟的官方文檔中了解。
延伸閱讀:
微軟 - 概觀:如何在 .NET 中格式化數位、日期、列舉和其他類型:https://learn.microsoft.com/zh-tw/dotnet/standard/base-types/formatting-types
從上述的不同功能的例子中,我們可以看到即使我們使用不同的程式語言,它們都會因為文字資料的特質而有著相似的字串功能。不過由於函式的使用方式還是會有些微的差異,因此還是會建議大家可以在使用的程式語言的官方文檔中了解。透過這些功能的輔助,我們便可以更方便及更快速的處理字串資料。